package bebetes.test;

import java.awt.Color;
import java.util.ArrayList;

import junit.framework.TestCase;
import bebetes.BebeteHasard;
import bebetes.ChampDeBebetes;

/**
 * Classe de tests pour la classe {@link BebeteHasard}.
 * 
 * @author COLLET Philippe
 * @author gnpt
 */
public class BebeteHasardTest2 extends TestCase {

	private ChampDeBebetes champ = new ChampDeBebetes(640, 480, 50);
	private BebeteHasard b = null;
	private double eps = 1E-4;

	@Override
	protected void setUp() throws Exception {
		super.setUp();
		this.b = new BebeteHasard(this.champ, this.champ.getHauteur() / 2,
				this.champ.getLargeur() / 2, 0f, 10f, Color.BLUE);
		ArrayList<BebeteHasard> lesBebetes = new ArrayList<BebeteHasard>();
		lesBebetes.add(this.b);
		this.champ.ajouterBebetes(lesBebetes);
	}

	@Override
	protected void tearDown() throws Exception {
		super.tearDown();

		this.champ = null;
	}

	/**
	 * Test des bornes de x et y.
	 */
	public void testEffectueDeplacementDeBase() {

		float oldv = this.b.getVitesseCourante();
		float oldd = this.b.getDirectionCourante();
		this.b.effectueDeplacement();

		assertTrue("Borne inf x :", this.b.getX() > 0);
		assertTrue("Borne sup x :", this.b.getX() < this.champ.getLargeur());

		assertTrue("Borne inf y :", this.b.getY() > 0);
		assertTrue("Borne sup y :", this.b.getY() < this.champ.getHauteur());

		assertEquals("Vitesse inchangé", this.b.getVitesseCourante(), oldv);
		assertEquals("Direction Inchangé", this.b.getDirectionCourante(), oldd);
	}

	/**
	 * Test pour un choc horizontal gauche et droite.
	 */
	public void testEffectueDeplacementChocHozizontaux() {

		this.b.setX(this.champ.getLargeur() - 9);
		this.b.effectueDeplacement();
		assertEquals("Choc Latéral droit direction droite", Math.PI, this.b
				.getDirectionCourante(), this.eps);

		this.b.setX(8);
		this.b.setDirectionCourante((float) Math.PI);
		this.b.effectueDeplacement();
		assertEquals("Choc Latéral gauche direction gauche", 0f, this.b
				.getDirectionCourante(), this.eps);
	}

	/**
	 * Test des chocs en diagonale côté droit.
	 */
	public void testEffectueDeplacementChocDiagonauxDroit() {

		this.b.setX(this.champ.getLargeur() - 5);
		this.b.setDirectionCourante(1);
		this.b.effectueDeplacement();
		this.b.effectueDeplacement();
		assertTrue("Choc Latéral droit direction haut", this.b
				.getDirectionCourante() > Math.PI / 2
				&& this.b.getDirectionCourante() < Math.PI);

		this.b.setX(this.champ.getLargeur() - 5);
		this.b.setDirectionCourante(-1);
		this.b.effectueDeplacement();
		this.b.effectueDeplacement();
		assertTrue("Choc Latéral droit direction bas", this.b
				.getDirectionCourante() > Math.PI
				&& this.b.getDirectionCourante() < 3 * Math.PI / 2);
	}

	/**
	 * Test des chocs en diagonale côté gauche.
	 */
	public void testEffectueDeplacementChocDiagonauxGauche() {

		this.b.setX(5);
		this.b.setDirectionCourante((float) Math.PI - 1);
		this.b.effectueDeplacement();
		this.b.effectueDeplacement();
		assertTrue("Choc Latéral gauche direction haut", this.b
				.getDirectionCourante() < (Math.PI / 2)
				&& this.b.getDirectionCourante() > 0);

		this.b.setX(5);
		this.b.setDirectionCourante((float) Math.PI + 1);
		this.b.effectueDeplacement();
		this.b.effectueDeplacement();
		assertTrue("Choc Latéral gauche direction bas", this.b
				.getDirectionCourante() > 3 * Math.PI / 2
				&& this.b.getDirectionCourante() < Math.PI * 2);
	}
}
